package org.mozhu.mboot.admin.personal.message.service;

import org.mozhu.mboot.admin.personal.message.entiity.Message;
import org.mozhu.mboot.admin.personal.message.entiity.MessageState;
import org.mozhu.mboot.core.data.IBaseService;
import org.mozhu.mboot.core.data.Searchable;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 消息 - 业务层接口
 *
 * @author mozhu
 */
public interface MessageService extends IBaseService<Message, Long> {
    String REPLY_TITLE_PREFIX = "message.reply.title.template";
    String FOWRARD_TITLE_PREFIX = "message.fowrard.title.template";
    String FOWRARD_CONTENT_TEMPLATE = "message.fowrard.content.template";

    /**
     * 得到用户 指定状态的消息
     *
     * @param userId
     * @param state
     * @param searchable
     * @return
     */
    Page<Message> findUserMessage(Long userId, MessageState state, Searchable searchable);

    /**
     * 查询消息的祖先 和 后代
     *
     * @param message
     * @return
     */
    List<Message> findAncestorsAndDescendants(Message message);

    /**
     * 保存草稿
     *
     * @param message
     */
    void saveDraft(Message message);

    /**
     * 发送消息
     *
     * @param message
     */
    void send(Message message);

    /**
     * 将消息移动到垃圾箱
     *
     * @param userId
     * @param messageId
     * @return
     */
    void recycle(Long userId, Long messageId);

    /**
     * 批量将消息移动到垃圾箱
     *
     * @param userId
     * @param messageIds
     * @return
     */
    void recycle(Long userId, Long[] messageIds);

    /**
     * 将消息保存到收藏箱
     *
     * @param userId
     * @param messageId
     * @return
     */
    void store(Long userId, Long messageId);

    /**
     * 批量将消息保存到收藏箱
     *
     * @param userId
     * @param messageIds
     * @return
     */
    void store(Long userId, Long[] messageIds);

    /**
     * 从垃圾箱删除消息
     *
     * @param userId
     * @param messageId
     */
    void delete(Long userId, Long messageId);

    /**
     * 从垃圾箱删除消息
     *
     * @param userId
     * @param messageIds
     */
    void delete(Long userId, Long[] messageIds);

    /**
     * 清空指定状态的消息
     *
     * @param userId
     * @param state
     */
    void clearBox(Long userId, MessageState state);

    /**
     * 清空草稿箱
     *
     * @param userId
     */
    void clearDraftBox(Long userId);

    /**
     * 清空收件箱
     *
     * @param userId
     */
    void clearInBox(Long userId);

    /**
     * 清空收件箱
     *
     * @param userId
     */
    void clearOutBox(Long userId);

    /**
     * 清空收藏箱
     *
     * @param userId
     */
    void clearStoreBox(Long userId);

    /**
     * 清空垃圾箱
     *
     * @param userId
     */
    void clearTrashBox(Long userId);

    /**
     * 未读收件箱消息总数
     *
     * @param userId
     */
    int countUnread(Long userId);

    /**
     * 标识为已读
     *
     * @param message
     */
    void markRead(Message message);

    /**
     * 标识为已回复
     *
     * @param message
     */
    void markReplied(Message message);

    void markRead(Long userId, Long[] ids);

}
